package com.dm.cloud.images.schedule;

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.dm.cloud.core.exception.CustomException;
import com.dm.cloud.images.common.po.ImagesAppArrange;
import com.dm.cloud.images.common.po.ImagesAppTask;
import com.dm.cloud.images.common.po.ImagesAppTaskContainer;
import com.dm.cloud.images.service.ImagesAppArrangeService;
import com.dm.cloud.images.service.ImagesAppTaskContainerService;
import com.dm.cloud.images.service.ImagesAppTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.util.Sqls;

import java.util.List;

/**
 * 在应用编排管理页面种， 点击一键启动应用、一键关闭应用后，数据库构建应用任务数据
 * 然后触发此处功能，用于初始化任务及关联容器信息
 * 下一步将在下一个定时任务中执行启动等操作
 */

@Component
@Slf4j
public class AppTask {

    @Autowired
    private ImagesAppTaskService imagesAppTaskService;

    @Autowired
    private ImagesAppTaskContainerService imagesAppTaskContainerService;

    @Autowired
    private ImagesAppArrangeService imagesAppArrangeService;

    @Value("${dm.images.service-id}")
    private String serviceId;
    //本系统最多并发执行{lte}个任务
    private final static int lt=3;

    @XxlJob("appTaskHandler")
    @Transactional
    public void appTaskHandler() throws Exception {
        XxlJobHelper.log("开始执行应用启动、关闭任务");
        log.debug("开始执行应用启动、关闭任务");
        ImagesAppTask task=imagesAppTaskService.findNoStartLimit1ByRunLt(lt); //获取一个未开始执行的任务
        if(task!=null){
            //获取已编排的容器
            List<ImagesAppArrange> imagesAppArranges=imagesAppArrangeService.findByAppCode(task.getAppCode());
            if(imagesAppArranges==null || imagesAppArranges.isEmpty()){
                //没有编排容器的任务，直接完成
                task.setStatus(2);
                task.setServiceId(serviceId);
                imagesAppTaskService.update(task);
                log.info(task.getId()+"没有编排容器的任务，直接完成");
                XxlJobHelper.log(task.getId()+"没有编排容器的任务，直接完成");
                return;
            }
            //先改任务状态，标记正在执行
            task.setStatus(1);
            task.setServiceId(serviceId);
            try {
                if(imagesAppTaskService.update(task)!=1){
                    throw new CustomException("修改任务状态失败!");
                }
            }catch (Exception e){
                e.printStackTrace();
                return;
            }

            //删除之前的任务容器信息
            imagesAppTaskContainerService.delete(Example
                    .builder(ImagesAppTaskContainer.class)
                    .andWhere(Sqls.custom().andEqualTo("taskId",task.getId()))
                    .build()
            );

           for (ImagesAppArrange imagesAppArrange : imagesAppArranges) {
               //添加任务容器信息
               imagesAppTaskContainerService.insert(
                       ImagesAppTaskContainer
                               .builder()
                               .status(0) //当前任务中 还未执行
                               .containerId(imagesAppArrange.getContainerId())
                               .nodeId(imagesAppArrange.getNodeId())
                               .taskId(task.getId())
                               .result(0)
                               .build()
               );

           }

        }else{
            log.info("任务队列已满或者没有新任务需求！");
            XxlJobHelper.log("任务队列已满或者没有新任务需求！");
        }
        log.info("结束执行应用启动、关闭任务");
        XxlJobHelper.log("结束执行应用启动、关闭任务");
    }

}
